/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 30318
 * Date: 2024-02-03
 * Time: 11:22
 */
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Test2 {
    // 函数一：把一个文本文件加密成密文文件
    public static void encryptFile(String inputFile, String outputFile) throws IOException {
        File input = new File(inputFile); // 创建输入文件对象
        File output = new File(outputFile); // 创建输出文件对象

        // 检查文件是否存在
        if (!input.exists()) {
            System.out.println("无法打开文件");
            System.exit(-1);
        }

        // 检查文件是否为空
        if (input.length() == 0) {
            System.out.println("输入文件内容为空");
            System.exit(-1);
        }

        FileInputStream inputStream = new FileInputStream(input); // 创建输入流对象
        FileOutputStream outputStream = new FileOutputStream(output); // 创建输出流对象

        int ch; // ch表示一个字节
        System.out.println("请选择要加密/解密的方式：");
        System.out.println("****    1、高四位和低四位对调   ****");
        System.out.println("****    2、高二位和低二位对调   ****");
        System.out.println("****        3、字节逆序         ****");
        System.out.println("**** 4、相邻两个字节中间4位互换 ****");
        int option = 0;
        Scanner scanner = new Scanner(System.in);
        option = scanner.nextInt();

        // 通过位运算符&和|来提取和合并字节中的特定位
        if (option == 1) {
            while ((ch = inputStream.read()) != -1) { // 读取输入文件的每个字节，直到文件末尾
                ch = ((ch & 0x0F) << 4) | ((ch & 0xF0) >> 4); // 高四位和低四位对调
                outputStream.write(ch); // 将加密后的字节写入输出文件
            }
        } else if (option == 2) {
            while ((ch = inputStream.read()) != -1) { // 读取输入文件的每个字节，直到文件末尾
                ch = ((ch & 0x33) << 2) | ((ch & 0xCC) >> 2); // 高二位和低二位对调
                outputStream.write(ch); // 将加密后的字节写入输出文件
            }
        } else if (option == 3) {
            while ((ch = inputStream.read()) != -1) { // 读取输入文件的每个字节，直到文件末尾
                ch = ((ch & 0x55) << 1) | ((ch & 0xAA) >> 1); // 字节逆序
                outputStream.write(ch); // 将加密后的字节写入输出文件
            }
        } else if (option == 4) {
            while ((ch = inputStream.read()) != -1) { // 读取输入文件的每个字节，直到文件末尾
                ch = ((ch & 0x0F) << 4) | ((ch & 0xF0) >> 4); // 相邻两个字节中间4位互换
                outputStream.write(ch); // 将加密后的字节写入输出文件
            }
        } else {
            System.out.println("输入内容有误");
        }

        inputStream.close(); // 关闭输入流
        outputStream.close(); // 关闭输出流
    }

    // 函数二：把密文文件解密成原文文件
    public static void decryptFile(String inputFile, String outputFile) throws IOException {
        encryptFile(inputFile, outputFile); // 解密和加密使用相同的算法
    }

    public static void main(String[] args) {
        String inputFile = "input.txt"; // 输入文件名
        String encryptedFile = "encrypted.txt"; // 加密后的文件名
        String decryptedFile = "decrypted.txt"; // 解密后的文件名

        try {
            encryptFile(inputFile, encryptedFile); // 加密输入文件
            System.out.println("文件加密完成");

            decryptFile(encryptedFile, decryptedFile); // 解密加密后的文件
            System.out.println("文件解密完成");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}